<?php

/**
 * 属性的访问控制
 */
class MyClass
{
    // 声明一个公有的构造函数
    public function __construct()
    {
//        print "构造函数初始化\n";
    }

    function __destruct()
    {
//        print "销毁 ";
    }

    // 声明一个公有的方法
    public function MyPublic()
    {
    }

    // 声明一个受保护的方法
    protected function MyProtected()
    {
    }

    // 声明一个私有的方法
    private function MyPrivate()
    {
    }

    // 此方法为公有
    function Foo()
    {
        $this->MyPublic();
        $this->MyProtected();
        $this->MyPrivate();
    }

}

$myclass = new MyClass;
$myclass->MyPublic(); // 这行能被正常执行
//$myclass->MyProtected(); // 这行会产生一个致命错误
//$myclass->MyPrivate(); // 这行会产生一个致命错误
$myclass->Foo(); // 公有，受保护，私有都可以执行


/**
 * Define MyClass2
 */
class MyClass2 extends MyClass
{
    // 此方法为公有
    function Foo2()
    {
        $this->MyPublic();
        $this->MyProtected();
//        $this->MyPrivate(); // 这行会产生一个致命错误
    }
}

$myclass2 = new MyClass2;
$myclass2->MyPublic(); // 这行能被正常执行
$myclass2->Foo2(); // 公有的和受保护的都可执行，但私有的不行

class Bar
{
    function __construct()
    {
        print "BaseClass 类中构造方法" . PHP_EOL;
    }

    public function test()
    {
        $this->testPublic();
    }

    public function testPublic()
    {
        echo "Bar::testPublic\n";
    }

    //父类中的方法被声明为 final，则子类无法覆盖该方法。如果一个类被声明为 final，则不能被继承
    final public function moreTesting()
    {
        echo "BaseClass::moreTesting() called" . PHP_EOL;
    }
}

class Foo extends Bar
{
    public static $my_static = 'foo';

    function __construct()
    {
        parent::__construct();  // 子类构造方法不能自动调用父类的构造方法
        print "SubClass 类中构造方法" . PHP_EOL;
    }

    public function staticValue()
    {
        return self::$my_static;
    }

    public function testPublic()
    {
        echo "Foo::testPublic\n";
    }
}

$myFoo = new Foo();
$myFoo->test();
print Foo::$my_static . PHP_EOL;
print $myFoo->staticValue() . PHP_EOL;
?>